Skip to content

fix(mobile): make the Android glass surface fully opaque - #14576

Merged
dylanjeffers merged 1 commit into
mainfrom
fix/mobile-glass-android-tint
Aug 25, 2026
Merged

fix(mobile): make the Android glass surface fully opaque#14576
dylanjeffers merged 1 commit into
mainfrom
fix/mobile-glass-android-tint

Conversation

@dylanjeffers

Copy link
Copy Markdown
Contributor

Follow-up to #14575, from the Android pass. This is a real defect in what we just merged.

The bug

Android has no backdrop blur, so GlassSurface fell back to a 0.94 tint to keep a hint of translucency. That only works in light mode.

Translucency reads as frost when something blurs what shows through. With no blur, whatever bleeds through keeps its edges and reads as legible ghost text sitting on top of the header. And the same alpha lands completely differently depending on the surface:

glass ghost peak relative contrast
Light RGB 248 229 ~8%
Dark RGB 14 27 ~93%

6% of near-white content over a near-black surface nearly doubles the luminance. In dark mode, track titles, artists, durations and play counts were plainly readable behind the header.

The fix

Android is now fully opaque — which is what the ProfileNavOverlay fallback this was meant to follow already does (backgroundColor: backgroundSurface, no opacity). I cited that precedent in #14575 and then didn't actually follow it; that was the bug.

No single alpha suits both themes, so Android trades the hint of translucency for a clean surface. Content still slides under the header, it just isn't see-through. iOS is unchanged and keeps its real blur.

Verification

Built assembleProdDebug and ran on a Pixel 8 Pro (API 35) emulator in dark mode with real content scrolled behind the header — the surface is now clean, and content clips at the glass edge instead of bleeding through. tsc 0 errors, eslint clean.

Also confirmed on Android during the same pass, unchanged by this fix: tab bar position/elevation and z-order against the play bar, now-playing drawer and left nav drawer; auto-hide of both bars; and content offset (at max scroll the last item lands exactly at the play bar top).

Known, not addressed here

The play bar doesn't participate in auto-hide, so hiding the chrome mid-playback leaves it floating with an empty band beneath it. Not Android-specific and pre-existing from #14575 — worth a separate change if we want the bottom chrome to move as one unit.

🤖 Generated with Claude Code

Android has no backdrop blur, so `GlassSurface` fell back to a 0.94 tint to
keep a hint of translucency. Verifying on a Pixel 8 Pro showed that only works
in light mode. Translucency reads as frost when something blurs what shows
through; with no blur, whatever bleeds through keeps its edges and reads as
legible ghost text sitting on the header.

The 6% bleed is ~8% relative contrast on a light surface (RGB 248) but ~93% on
a dark one (RGB 14) — 6% of near-white content over near-black nearly doubles
the luminance. In dark mode track titles, artists, durations and play counts
were plainly readable behind the header.

No single alpha works for both themes, so Android now trades the hint of
translucency for a clean surface, matching the `ProfileNavOverlay` fallback
this was meant to follow in the first place. Content still slides under the
header — it just isn't see-through. iOS is unchanged and keeps its real blur.

Verified on the Android emulator in dark mode with real content behind the
header; iOS untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@changeset-bot

changeset-bot Bot commented Aug 24, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: a8563b3

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@dylanjeffers
dylanjeffers merged commit 43a53fe into main Aug 25, 2026
3 checks passed
@dylanjeffers
dylanjeffers deleted the fix/mobile-glass-android-tint branch August 25, 2026 00:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant